package com.teamwings.util;

import org.springframework.util.StringUtils;

import java.util.regex.Pattern;

/**
 * 简单字段注入过滤
 */
public class FieldInject {
    // SQL语法检查正则：只检查一个关键字可能存在误判情况，这里要求必须符合两个关键字（有先后顺序）才算匹配
    // 第一组关键字
    static final String group1 = "insert|delete|update|select|create|drop|truncate|grant|alter|deny|revoke|call|execute|exec|declare|show|rename|set";
    // 第二组关键字
    static final String group2 = "into|from|set|where|table|database|view|index|on|cursor|procedure|trigger|for|password|union|and|or";
    // 构造SQL语法检查正则
    static final Pattern sqlSyntaxPattern = Pattern.compile("(" + group1 + ").+(" + group2 + ")", Pattern.CASE_INSENSITIVE);
    // 使用'、;或注释截断SQL检查正则
    static final Pattern sqlCommentPattern = Pattern.compile("'.*(or|union|--|#|/*|;)", Pattern.CASE_INSENSITIVE);

    public static String filter(String fieldValue) {
        if (validate(fieldValue)) {
            return fieldValue;
        } else {
            return "";
        }
    }

    /**
     * 检查参数是否合法
     *
     * @param value
     * @return  合法返回 true
     */
    private static boolean validate(String value) {
        // 空值一定不包含敏感字符，所以认为合法
        if (StringUtils.isEmpty(value)) {
            return true;
        }
        // 处理是否包含SQL注释字符
        if (sqlCommentPattern.matcher(value).find()) {
            return false;
        }
        // 检查是否包含SQL注入敏感字符
        if (sqlSyntaxPattern.matcher(value).find()) {
            return false;
        }

        return true;
    }
}
